Node.js Agent Reference

Node.js HTTP/HTTPS client

এজেন্ট বস্তু

Node.js Agent HTTP/HTTPS client . host port , host port socket .

দুটি প্রাথমিক এজেন্ট বাস্তবায়ন আছে:

http.Agent

HTTP সংযোগ পরিচালনা করতে

https.Agent

HTTPS সংযোগ পরিচালনা করতে

এজেন্ট আমদানি করা হচ্ছে

// HTTP মডিউল আমদানি করুন const http = প্রয়োজন('http'); // ডিফল্ট এজেন্ট const defaultAgent = http.globalAgent; // একটি কাস্টম এজেন্ট তৈরি করুন const customAgent = নতুন http.Agent({ KeepAlive: সত্য, সর্বোচ্চ সকেট: 25 });

এজেন্ট বৈশিষ্ট্য

বৈশিষ্ট্য ব্যাখ্যা
agent.freeSockets KeepAlive সক্রিয় থাকলে সকেট ধারণকারী একটি বস্তু বর্তমানে এজেন্ট দ্বারা ব্যবহারের জন্য অপেক্ষা করছে। সরাসরি পরিবর্তন করবেন না
agent.maxFreeSockets মুক্ত অবস্থায় খোলা যেতে পারে এমন সর্বোচ্চ সংখ্যক সকেট সেট করে। KeepAlive সত্যে সেট করা থাকলেই কেবল প্রাসঙ্গিক। ডিফল্ট: 256
agent.maxSockets একজন এজেন্টের উৎপত্তি প্রতি সর্বাধিক কতগুলি খোলা সকেট থাকতে পারে তা সেট করে। ডিফল্ট: ইনফিনিটি
agent.maxTotalSockets সর্বাধিক সংখ্যক সকেট সেট করে যা সমস্ত উত্স জুড়ে খোলা যেতে পারে। ডিফল্ট: ইনফিনিটি
agent.requests সারিবদ্ধ অনুরোধ সমন্বিত একটি বস্তু যা এখনও সকেটগুলিতে বরাদ্দ করা হয়নি। সরাসরি পরিবর্তন করবেন না
agent.sockets এজেন্টের দ্বারা বর্তমানে ব্যবহৃত সকেটের বিন্যাস ধারণকারী একটি বস্তু। সরাসরি পরিবর্তন করবেন না

এজেন্ট পদ্ধতি

পদ্ধতি ব্যাখ্যা
agent.createConnection(options[, callback]) HTTP অনুরোধের জন্য ব্যবহার করার জন্য একটি সকেট/স্ট্রিম তৈরি করে। ডিফল্টরূপে, এই ফাংশন net.createConnection() ব্যবহার করে তবে এটি ওভাররাইড করা যেতে পারে
agent.destroy() এজেন্টের দ্বারা বর্তমানে ব্যবহৃত যেকোন সকেট সাফ করে
agent.getName(options) একটি সংযোগ পুনরায় ব্যবহার করা যাবে কিনা তা নির্ধারণ করতে ব্যবহৃত অনুরোধ বিকল্পগুলির সেটের জন্য একটি অনন্য নাম পায়৷
agent.keepSocketAlive(socket) সকেট কল করা হয় যখন একটি অনুরোধ বিচ্ছিন্ন করা হয় এবং এজেন্ট দ্বারা অব্যাহত থাকতে পারে। ডিফল্ট আচরণ হল freeSockets তালিকায় সকেট যোগ করা
agent.reuseSocket(socket, request) সকেট কিপ-লাইভ বিকল্পগুলির কারণে প্রতিষ্ঠিত হওয়ার পরে একটি অনুরোধের সাথে সংযোগ করার সময় কল করা হয়

ডিফল্ট এজেন্ট ব্যবহার করে

ডিফল্টরূপে, HTTP/HTTPS ক্লায়েন্ট অনুরোধগুলি গ্লোবাল এজেন্ট ব্যবহার করে (http.globalAgent বা https.globalAgent):

const http = প্রয়োজন('http'); // ডিফল্ট এজেন্ট ব্যবহার করে একটি অনুরোধ করুন http.get('http://example.com', (res) => { console.log(`স্থিতি কোড: ${res.statusCode}`); // গ্লোবাল এজেন্ট তথ্য প্রদর্শন করুন const agent = http.globalAgent; console.log(`বর্তমান সকেট: ${Object.keys(agent.sockets).length}`); console.log(`ফ্রি সকেট: ${Object.keys(agent.freeSockets).length}`); console.log(`সারিবদ্ধ অনুরোধ: ${Object.keys(agent.requests).length}`); // প্রতিক্রিয়া ডেটা ব্যবহার করুন res.resume(); }).on('error', (err) => { console.error(`ত্রুটি: ${err.message}`); });

একটি কাস্টম এজেন্ট তৈরি করা

একটি কাস্টম এজেন্ট নির্দিষ্ট সেটিংস দিয়ে তৈরি করা যেতে পারে:

const http = প্রয়োজন('http'); // কিপ-লাইভ সক্ষম করে একটি কাস্টম এজেন্ট তৈরি করুন const keepAliveAgent = নতুন http.Agent({ KeepAlive: সত্য, // সংযোগগুলি পুনরায় ব্যবহারের জন্য খোলা রাখুন KeepAliveMsecs: 1000, // একটি TCP KeepAlive প্যাকেট পাঠানোর আগে মিলিসেকেন্ড অপেক্ষা করতে হবে maxSockets: 10, // হোস্ট প্রতি সকেটের সর্বোচ্চ সংখ্যা maxFreeSockets: 5, // KeepAlive সত্য হলে নিষ্ক্রিয় সকেটের সর্বাধিক সংখ্যা টাইমআউট: 60000, // মিলিসেকেন্ডে সকেট টাইমআউট সময়সূচী: 'fifo' // FIFO চাহিদা নির্ধারণ (LIFO এর পরিবর্তে) }); // একটি কাস্টম এজেন্ট ব্যবহার করে একটি অনুরোধ করুন const বিকল্প = { হোস্টনাম: 'example.com', পথ: '/', পদ্ধতি: 'GET', এজেন্ট: KeepAliveAgent // আমাদের কাস্টম এজেন্ট ব্যবহার করুন }; const req = http.request(options, (res) => { console.log(`স্থিতি কোড: ${res.statusCode}`); // কাস্টম এজেন্ট তথ্য প্রদর্শন করুন console.log(`বর্তমান সকেট: ${Object.keys(keepAliveAgent.sockets).length}`); console.log(`ফ্রি সকেট: ${Object.keys(keepAliveAgent.freeSockets).length}`); // প্রতিক্রিয়া ডেটা ব্যবহার করুন // সকেট পুনরায় ব্যবহার প্রদর্শনের জন্য একটি দ্বিতীয় অনুরোধ করুন setTimeout(() => { console.log('সকেট পুনরায় ব্যবহার প্রদর্শনের জন্য দ্বিতীয় অনুরোধ করা হচ্ছে...'); http.request(options, (res2) => { console.log(`দ্বিতীয় অনুরোধের স্থিতি: ${res2.statusCode}`); console.log(`বর্তমান সকেট: ${Object.keys(keepAliveAgent.sockets).length}`); console.log(`ফ্রি সকেট: ${Object.keys(keepAliveAgent.freeSockets).length}`); // পরিষ্কার করা setTimeout(() => { keepAliveAgent.destroy(); console.log('এজেন্ট ধ্বংস'); }, 1000); res2.resume(); }).শেষ(); }, 2000); }); req.on('error', (err) => { console.error(`ত্রুটি: ${err.message}`); }); req.end();

HTTPS Agent

HTTPS অনুরোধের জন্য, অতিরিক্ত SSL/TLS বিকল্পগুলির সাথে একটি HTTPS-নির্দিষ্ট এজেন্ট তৈরি করা যেতে পারে:

const https = প্রয়োজন('https'); const fs = প্রয়োজন('fs'); // SSL বিকল্পগুলির সাথে একটি কাস্টম HTTPS এজেন্ট তৈরি করুন const httpsAgent = নতুন https.Agent({ KeepAlive: সত্য, সর্বোচ্চ সকেট: 10, // SSL/TLS বিকল্প ca: fs.readFileSync('ca-cert.pem'), // শংসাপত্র কর্তৃপক্ষ শংসাপত্র: fs.readFileSync('client-cert.pem'), // ক্লায়েন্ট শংসাপত্র কী: fs.readFileSync('client-key.pem'), // ক্লায়েন্ট ব্যক্তিগত কী // অতিরিক্ত TLS বিকল্প প্রত্যাখ্যান অননুমোদিত: সত্য, // সার্ভার শংসাপত্র পরীক্ষা করুন নিরাপদ প্রোটোকল: 'TLSv1_2_method', // TLS v1.2 ব্যবহার করুন সাইফার: 'HIGH:!aNULL:!MD5', // অনুমোদিত সাইফার সেট করুন honorCipherOrder: true // সাইফার অর্ডারকে সম্মান করুন }); // HTTPS এজেন্ট ব্যবহার করে একটি নিরাপদ অনুরোধ করুন const বিকল্প = { হোস্টনাম: 'secure-example.com', পথ: '/', পদ্ধতি: 'GET', এজেন্ট: httpsAgent }; const req = https.request(options, (res) => { console.log(`স্থিতি কোড: ${res.statusCode}`); // TLS/SSL-নির্দিষ্ট তথ্য প্রদর্শন করুন console.log(`TLS প্রোটোকল: ${res.socket.getProtocol()}`); console.log(`সাইফার: ${res.socket.getCipher().name}`); console.log(`সার্ভার সার্টিফিকেট বৈধ: ${res.socket.authorized}`); // প্রতিক্রিয়া ডেটা ব্যবহার করুন // পরিষ্কার করা setTimeout(() => { httpsAgent.destroy(); console.log('HTTPS এজেন্ট ধ্বংস'); }, 1000); }); req.on('error', (err) => { console.error(`ত্রুটি: ${err.message}`); }); req.end();

সংযোগ পুলিং নিষ্ক্রিয় করা হচ্ছে

এজেন্টকে মিথ্যাতে সেট করে সংযোগ পুলিং অক্ষম করা যেতে পারে:

const http = প্রয়োজন('http'); // এজেন্টের সাথে একটি অনুরোধ করুন: সংযোগ পুলিং নিষ্ক্রিয় করতে মিথ্যা const বিকল্প = { হোস্টনাম: 'example.com', পথ: '/', পদ্ধতি: 'GET', এজেন্ট: মিথ্যা // সংযোগ পুলিং অক্ষম করুন }; const req = http.request(options, (res) => { console.log(`স্থিতি কোড: ${res.statusCode}`); console.log('একটি নতুন সংযোগ ব্যবহার করা হচ্ছে (কোন এজেন্ট নয়)'); // প্রতিক্রিয়া ডেটা ব্যবহার করুন res.resume(); }); req.on('error', (err) => { console.error(`ত্রুটি: ${err.message}`); }); req.end();

সংযোগ পুলিং এর উদাহরণ

এই উদাহরণটি একাধিক অনুরোধের সাথে সংযোগ পুলিংয়ের কার্যকারিতা সুবিধাগুলি প্রদর্শন করে:

const http = প্রয়োজন('http'); const { কর্মক্ষমতা } = প্রয়োজন('perf_hooks'); // একটি ফাংশন যা একটি প্রদত্ত এজেন্টের সাথে একাধিক অনুরোধ করে async ফাংশন makeMultipleRequests(useAgent, numRequests = 10) { // লক্ষ্য নির্ধারণ করুন const hostname = 'example.com'; const পাথ = '/'; // এজেন্ট নির্বাচন করুন const agent = useAgent? নতুন http.Agent({ keepAlive: true }): মিথ্যা; console.log(${useAgent? 'কাস্টম এজেন্ট' : 'নো এজেন্ট'}' দিয়ে ${numRequests} অনুরোধ করা হচ্ছে); const startTime = performance.now(); // একাধিক অনুরোধ করুন জন্য (আসুন i = 0; i < numRequests; i++) { অপেক্ষা করুন নতুন প্রতিশ্রুতি((সমাধান, প্রত্যাখ্যান) => { const req = http.request({ হোস্টনাম, পথ, পদ্ধতি: 'GET', এজেন্ট }, (res) => { // প্রতিক্রিয়া ডেটা ব্যবহার করুন res.resume(); res.on('end', () => { সমাধান(); }); }); req.on('error', (err) => { console.error(`Request ${i + 1} error: ${err.message}`); প্রত্যাখ্যান (ভ্রান্তি); }); req.end(); }).catch(() => {}); // একটি অনুরোধ ধরা ব্যর্থ হলেও লুপ চালিয়ে যান } const endTime = performance.now(); console.log(`সময় নেওয়া: ${(endTime - startTime).toFixed(2)}ms`); // পরিষ্কার করা যদি (ব্যবহারকারী এজেন্ট এবং এজেন্ট) { agent.destroy(); } রিটার্ন এন্ডটাইম - শুরুর সময়; } // তুলনা চালান async ফাংশন run Comparison() { console.log('এজেন্টের সাথে এবং ছাড়া HTTP অনুরোধের কর্মক্ষমতা পরীক্ষা করা'); console.log('----------------------------------------------------------------'); // এজেন্ট ছাড়া (কোন সংযোগ পুলিং) const timeWithoutAgent = await makeMultipleRequests(false); console.log(''); // বিভাজক // এজেন্টের সাথে (সংযোগ পুলিং) const timeWithAgent = await makeMultipleRequests(true); console.log(''); // বিভাজক console.log('ফলাফল:'); console.log(`এজেন্ট ছাড়া: ${timeWithoutAgent.toFixed(2)}ms`); console.log(`এজেন্টের সাথে: ${timeWithAgent.toFixed(2)}ms`); console.log(`পার্থক্য: ${(timeWithoutAgent - timeWithAgent).toFixed(2)}ms`); console.log(`কর্মক্ষমতা উন্নতি: ${(100 * (timeWithoutAgent - timeWithAgent) / timeWithoutAgent).toFixed(2)}%`); } // তুলনা চালান run Comparison().catch(console.error);

একটি প্রক্সি এজেন্ট তৈরি করা

একটি প্রক্সি এজেন্ট তৈরি করতে এজেন্ট ক্লাস বাড়ানো যেতে পারে:

const http = প্রয়োজন('http'); const net = প্রয়োজন ('নেট'); const { URL } = require('url'); // একটি সহজ HTTP প্রক্সি এজেন্ট বাস্তবায়ন ক্লাস HttpProxyAgent প্রসারিত করে http.Agent { কনস্ট্রাক্টর(proxyUri, options = {}) { সুপার (বিকল্প); this.proxyUri = নতুন URL(proxyUri); } // প্রক্সির মাধ্যমে সংযোগ করতে CreateConnection ওভাররাইড করুন সৃষ্টি সংযোগ (বিকল্প, কলব্যাক) { // প্রক্সি সার্ভারের সাথে সংযোগ করুন const proxySocket = net.connect({ হোস্ট: this.proxyUri.hostname, পোর্ট: this.proxyUri.port || 80, }, () => { // প্রক্সির মাধ্যমে গন্তব্যে একটি HTTP সংযোগের অনুরোধ করুন proxySocket.write( `কানেক্ট করুন ${options.host}:${options.port} HTTP/1.1\r\n` + `হোস্ট: ${options.host}:${options.port}\r\n` + `প্রক্সি-সংযোগ: বাঁচিয়ে রাখুন\r\n` + // প্রক্সি প্রমাণীকরণ প্রদান করা হলে যোগ করুন (this.proxyUri.username && this.proxyUri.password ? `প্রক্সি-অথোরাইজেশন: বেসিক ${Buffer.from( `${this.proxyUri.username}:${this.proxyUri.password}` .toString('base64')}\r\n` :') + '\r\n' ); // প্রক্সি প্রতিক্রিয়ার জন্য ডেটা হ্যান্ডলার যাক proxyResponse = ''; const onData = (খণ্ড) => { proxyResponse += chunk.toString(); // পরীক্ষা করুন যে আমরা সম্পূর্ণ প্রক্সি প্রতিক্রিয়া পেয়েছি যদি (proxyResponse.includes('\r\n\r\n')) { // স্ট্যাটাস লাইন পার্স করুন const statusLine = proxyResponse.split('\r\n')[0]; const statusCode = parseInt(statusLine.split('')[1], 10); // যদি প্রক্সি সংযোগ সফল হয় যদি (statusCode === 200) { // ডেটা লিসেনার সরান, এটি আর প্রয়োজন নেই proxySocket.removeListener('ডেটা', onData); // সকেট সহ কলব্যাক কলব্যাক (নাল, প্রক্সিসকেট); } অন্য { // প্রক্সি সংযোগ ব্যর্থ হয়েছে৷ proxySocket.destroy(); কলব্যাক(নতুন ত্রুটি(`প্রক্সি সংযোগ ব্যর্থ হয়েছে: ${statusLine}`)); } } }; proxySocket.on('ডেটা', onData); }); // সকেট ত্রুটিগুলি পরিচালনা করুন proxySocket.on('error', (err) => { কলব্যাক (ত্রুটি); }); রিটার্ন প্রক্সিসকেট; } } // প্রক্সি এজেন্ট ব্যবহারের উদাহরণ const proxyAgent = নতুন HttpProxyAgent('http://proxy.example.com:8080', { KeepAlive: সত্য }); // প্রক্সির মাধ্যমে একটি অনুরোধ করুন const বিকল্প = { হোস্টনাম: 'target-site.com', পথ: '/', পদ্ধতি: 'GET', এজেন্ট: proxyAgent }; const req = http.request(options, (res) => { console.log(`স্থিতি কোড: ${res.statusCode}`); // প্রতিক্রিয়া ডেটা ব্যবহার করুন // পরিষ্কার করা setTimeout(() => { proxyAgent.destroy(); console.log('প্রক্সি এজেন্ট ধ্বংস'); }, 1000); }); req.on('error', (err) => { console.error(`ত্রুটি: ${err.message}`); }); req.end();

সর্বোত্তম অনুশীলন

KeepAlive ব্যবহার করুন:একই সার্ভারে একাধিক অনুরোধ করার সময় কর্মক্ষমতা উন্নত করতে অবিরাম সংযোগের জন্য KeepAlive সক্ষম করুন
ম্যাক্স সকেট সেট করুন:টার্গেট সার্ভার বা আপনার নিজস্ব সিস্টেমের সংস্থান অপ্রতিরোধ্য প্রতিরোধ করতে maxSockets সীমাবদ্ধ করুন
পরিষ্কার করুন:এজেন্টের আর প্রয়োজন না থাকলে সংস্থান প্রকাশ করতে agent.destroy() এ কল করুন
কাস্টম এজেন্ট ব্যবহার করুন:বিভিন্ন সংযোগের প্রয়োজনীয়তা বা লক্ষ্য সার্ভারের জন্য বিভিন্ন এজেন্ট উদাহরণ তৈরি করুন
মনিটর এজেন্ট স্বাস্থ্য:সংযোগ সমস্যা সনাক্ত করতে সক্রিয় এবং বিনামূল্যে সকেট সংখ্যা নিরীক্ষণ
নিরাপত্তা:HTTPS এজেন্টদের জন্য, সর্বদা উপযুক্ত SSL/TLS বিকল্পগুলি সেট করুন এবং নিরাপত্তা সেটিংস আপ টু ডেট রাখুন
ত্রুটি হ্যান্ডলিং:HTTP অনুরোধে সর্বদা সম্ভাব্য ত্রুটিগুলি পরিচালনা করুন

অনুশীলন করুন

Node.js HTTP client Agent .

http.ConnectionManager
✗ ভুল! "http.ConnectionManager" Node.js-এ একটি বৈধ প্রকার নয়
http.Agent
✓ ঠিক আছে! Node.js-এ HTTP ক্লায়েন্ট অনুরোধের জন্য সংযোগ ব্যবস্থাপনার জন্য ব্যবহৃত সঠিক এজেন্টের ধরন হল "http.Agent"
http.PoolManager
✗ ভুল! "http.PoolManager" Node.js-এ একটি বৈধ প্রকার নয়
http.ConnectionPool
✗ ভুল! "http.ConnectionPool" Node.js-এ একটি বৈধ প্রকার নয়